package com.xmqsfsky1017.skysrf.utils;
import android.content.Context;
import android.util.AttributeSet;
import android.view.View;
import android.view.ViewGroup;
import android.widget.LinearLayout;
import java.util.Iterator;
import java.util.NoSuchElementException;

/**
 * 递归遍历所有嵌套 ViewGroup 中指定类型元素的迭代器
 * 继承 LinearLayout 以支持作为容器自身被遍历
 * */
public  class ViewIter implements Iterator<View>,Iterable<View>{
        // 目标遍历的 ViewGroup（如果为 null，则遍历自身）
        private final ViewGroup targetViewGroup;
        // 子 ViewGroup 的迭代器（用于递归遍历）
        private ViewIter innerIteration;
        // 当前遍历到的子元素索引
        private int currentViewIndex = 0;
        // 目标类型的 Class 对象
        private final Class<?> targetClass;

        // 构造方法 1：传入上下文和目标类型，目标为自身
        public ViewIter(Context context, Class<?> targetClass) {
            super();
            this.targetViewGroup = new LinearLayout(context);
            this.targetClass = targetClass;
        }

        // 构造方法 2：传入上下文、AttributeSet 和目标类型，目标为自身
        public ViewIter(Context context, AttributeSet attrs, Class<?> targetClass) {
            super();
            this.targetViewGroup = new LinearLayout(context, attrs);
            this.targetClass = targetClass;
        }

        // 构造方法 3：传入上下文、AttributeSet、样式和目标类型，目标为自身
        public ViewIter(Context context, AttributeSet attrs, int defStyleAttr, Class<?> targetClass) {
            super();
            this.targetViewGroup = new LinearLayout(context, attrs, defStyleAttr);
            this.targetClass = targetClass;
        }

        // 构造方法 4：传入上下文、AttributeSet、样式、资源和目标类型，目标为自身
        public ViewIter(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes, Class<?> targetClass) {
            super();
            this.targetViewGroup = new LinearLayout(context, attrs, defStyleAttr, defStyleRes);
            this.targetClass = targetClass;
        }

        // 构造方法 5：传入外部 ViewGroup 和目标类型作为遍历目标
        public ViewIter(ViewGroup target, Class<?> targetClass) {
            super();
            this.targetViewGroup = target;
            this.targetClass = targetClass;
        }

        /**
         * 判断是否有下一个指定类型元素（递归检查所有层级）
         * @return 存在则返回 true，否则 false
         */
        @Override
        public boolean hasNext() {
            // 1. 先检查子迭代器是否还有未遍历的元素
            if (innerIteration != null) {
                if (innerIteration.hasNext()) {
                    return true; // 子迭代器还有元素
                } else {
                    innerIteration = null; // 子迭代器已遍历完，重置
                }
            }

            // 2. 遍历当前目标容器的子元素
            int childCount = targetViewGroup.getChildCount();
            while (currentViewIndex < childCount) {
                View child = targetViewGroup.getChildAt(currentViewIndex);

                // 2.1 如果当前子元素是目标类型，存在下一个元素
                if (targetClass.isInstance(child)) {
                    return true;
                }

                // 2.2 如果当前子元素是 ViewGroup，递归检查其内部
                else if (child instanceof ViewGroup) {
                    // 创建子 ViewGroup 的迭代器（传入子 ViewGroup 作为目标）
                    innerIteration = new ViewIter((ViewGroup) child, targetClass);
                    // 检查子迭代器是否有元素
                    if (innerIteration.hasNext()) {
                        return true;
                    } else {
                        innerIteration = null; // 子容器无元素，继续检查下一个
                    }
                }

                // 2.3 既不是目标类型也不是 ViewGroup，检查下一个元素
                currentViewIndex++;
            }

            // 3. 所有元素遍历完毕，无下一个元素
            return false;
        }

        /**
         * 获取下一个指定类型元素（需配合 hasNext() 使用）
         * @return 下一个指定类型元素
         * @throws NoSuchElementException 无元素时抛出
         */
        @Override
        public View next() {
            if (!hasNext()) {
                throw new NoSuchElementException("已遍历完所有元素，无更多指定类型元素");
            }

            // 1. 优先返回子迭代器的下一个元素
            if (innerIteration != null && innerIteration.hasNext()) {
                return innerIteration.next();
            }

            // 2. 子迭代器已处理完，重置
            innerIteration = null;

            // 3. 返回当前目标容器中符合条件的元素（已通过 hasNext() 验证类型）
            View currentChild = targetViewGroup.getChildAt(currentViewIndex);
            // 移动索引到下一个，准备下一次遍历
            currentViewIndex++;
            return currentChild;
        }

        /**
         * 移除当前元素（默认不支持，如需实现需重写）
         * @throws UnsupportedOperationException 始终抛出，因未实现
         */
        @Override
        public void remove() {
            throw new UnsupportedOperationException("ViewIter 不支持移除元素操作");
		}
        @Override
        public Iterator<View> iterator() {
            return this;
        }
    }
